package com.lingxinst.farm.base.ui

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.ActionBar
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import com.orhanobut.logger.Logger
import com.therouter.TheRouter

/**
 * @description:
 * @author: Lynn
 * @datetime: 2025/6/16 13:21
 **/
abstract class BaseFragment : Fragment(), IBaseView {
    private lateinit var tag: String


    /**
     * 在Fragment与Activity绑定时调用。
     * 此时Fragment还没有初始化布局，它还没有创建视图层次结构。
     */
    override fun onAttach(context: Context) {
        super.onAttach(context)
        tag = initTag()
        Logger.e("onAttach: $tag")
    }

    abstract fun initTag(): String

    /**
     * 初始化Fragment时调用，通常用于初始化不与视图相关的部分，比如数据或资源。
     * 适合在这里保存和恢复任何不依赖于视图层次结构的状态。
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        TheRouter.inject(this)
        Logger.e("onCreate: $tag")
        initParam()
    }

    override fun initParam() {

    }

    /**
     * 为Fragment创建视图（UI）层次结构时调用。
     * 在这个方法中创建并返回Fragment的视图层次。
     */
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Logger.e("onCreateView: $tag")
        val view = initVM(inflater, container, savedInstanceState)
        getToolBar()?.let {
            setUpToolbar(it)
        }
        return view
    }


    abstract fun initVM(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View?

    // This function is open and returns a Toolbar object
    open fun getToolBar(): Toolbar? {
        // Return null
        return null
    }

    override fun setUpToolbar(toolbar: Toolbar) {
        // 设置Toolbar为ActionBar
        (requireActivity() as AppCompatActivity).setSupportActionBar(toolbar)
        // 启用菜单选项,确保Fragment接收与菜单相关的回调
        setHasOptionsMenu(true)
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        // 清除Activity的菜单项
        // 避免Activity和Fragment的菜单项混合显示
        menu.clear();
//        inflater.inflate(R.menu.fragment_menu, menu); // 加载Fragment的菜单资源
    }


    /**
     * 在Fragment的视图被系统创建并且已经初始化之后调用。
     * 这是初始化视图组件和设置观察者的理想位置
     */
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Logger.e("onViewCreated: $tag")

        val actionBar = (requireActivity() as AppCompatActivity).supportActionBar
        if (actionBar != null) {
            initUIView(view, savedInstanceState, actionBar)
        } else {
            initUIView(view, savedInstanceState)
        }

        setObserver()
    }


    abstract fun initUIView(view: View, savedInstanceState: Bundle?, actionBar: ActionBar? = null)

    override fun setObserver() {}

    /**
     * 当Fragment对用户是可见时调用，此时Fragment处于“可见但未获取焦点”的状态。
     */
    override fun onStart() {
        super.onStart()
        Logger.e("onStart: $tag")
    }

    /**
     * 当Fragment进入“活动”状态并且与用户交互时调用。
     */
    override fun onResume() {
        super.onResume()
        Logger.e("onResume: $tag")
    }

    /**
     * 当Fragment未获取焦点但仍可见时调用。
     */
    override fun onPause() {
        super.onPause()
        Logger.e("onPause: $tag")
    }

    /**
     * 当Fragment不再可见时调用。
     */
    override fun onStop() {
        super.onStop()
        Logger.e("onStop: $tag")
    }

    /**
     * 当Fragment的视图层次结构被销毁时调用。
     */
    override fun onDestroyView() {
        super.onDestroyView()
        Logger.e("onDestroyView: $tag")
    }

    /**
     * 在Fragment即将被销毁之前调用。
     */
    override fun onDestroy() {
        super.onDestroy()
        Logger.e("onDestroy: $tag")
    }

    /**
     * 当Fragment与Activity解绑时调用。
     */
    override fun onDetach() {
        super.onDetach()
        Logger.e("onDetach: $tag")
    }


}